<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<!--
//
// Copyright 2007-2010 Qianyan Cai
// Under the terms of the GNU Lesser General Public License version 2.1
//
-->
<html>
<head>
<meta name="Content-Type" content="text/html; charset=UTF-8" http-equiv="Content-Type">
<title>Objot 版本22 Javascript端手册</title>
<style>
	body	{ padding:0; margin:1em; background:white; line-height:1.4; font-family:sans-serif; }
	h2		{ margin:3em 0 1em; padding:0.2ex 0; border-bottom:0.3ex solid #cdf; color:#730; }
	h3		{ margin:2em 0 1em 1em; padding:0; color:#015; }
	h4		{ margin:2em 0 1em 2em; padding:0; color:#015; }
	a:link		{ color: #04e; text-decoration:none; }
	a:visited	{ color: #60c; text-decoration:none; }
	a:hover		{ background:#ddf; }
	table	{ margin:0 3ex 1em; background:#f6f6f6; }
	td		{ padding:0 1ex 0.3ex; border-bottom:1px solid #ee9; }
	pre		{ margin:1ex 2ex; padding:0.6ex; border:1px solid #cc6; background:#f2f2f2; line-height:1; }
</style>
</head>
<body>


<!--@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@-->


<h1	align=center><a href=http://objot.com>Objot</a> 版本22 Javascript端手册</h1>
<hr>

<p>版权所有2007-2010蔡倩彦，采用GNU LGPL版本2.1许可模式。

<p>关于Java端开发请参考<a href=manual-java-zh.html>《Objot 版本22 Java端手册》</a>。
关于Actionscript端开发请参考<a href=manual-as-zh.html>《Objot 版本22 Actionscript端手册》</a>。

<p>所有以$为前缀的属性都由objot保留使用

<ul>
	<li><a href=#demo>范例</a></li>
	<li><a href=#codec>数据编解码</a></li>
	<li><a href=#net>网络</a></li>
	<li><a href=#dom>DOM操作</a></li>
	<li><a href=#other>其他</a></li>
</ul>


<!--@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@-->


<h2 id=demo>范例</h2>

<p>参考<a href=manual-java-zh.html>《Objot 版本22 Java端手册》</a>


<!--@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@-->


<h2 id=codec>数据编解码</h2>

<p>参考<a href=manual-java-zh.html>《Objot 版本22 Java端手册》</a>。

<!--****************************************************************************************-->

<h5><i>$class</i> = function (codec, ctor, sup, proto)</h5>
将一个函数定义为 类及其构造函数。if(codec)则此类可以被编解码。
ctor为此函数的名字（将用eval得到此函数），例如'foo.Bar'（必须预先定义好foo.Bar这个函数）。
sup为父类（即父类的构造函数）。proto的属性被复制到此类的prototype中。

<h5><i>$class.enc</i> = function (clazz, key, encs)</h5>
为类添加编码规则。clazz是类（即构造函数）。
key是规则key，当编码时指定这个key或其子类时，依据encs来编码。
encs==null表示对象的所有自有属性（hasOwnProperty）被编码；
否则encs是字符串数组，表示对应key及其子类，哪些属性需要编码。

<h5><i>$enc</i> = function (o, ruleKey)</h5>
编码，使用的规则与 每个编码的对象 及ruleKey相关。

<h5><i>$dec</i> = function (s, byName, decoded)</h5>
解码，使用的规则与 每个解码的对象 及ruleKey相关。返回数据图的根。
byName是function(name)，返回由name得到的对象。
如果byName为null，则默认方式是：根据$class指定的名字直接创建对象，不调用构造函数。
decoded是function(o)，o是已经完成解码的对象，可用于解码后处理。

<p>例如定义Ok和Err表示服务成功和失败，ErrUnsigned表示服务需要用户登入验证：
<pre>Ok = function (hint) {
	this.hint = $(hint);
}
Err = function (hint) {
	this.hint = $(hint);
}
ErrUnsigned = function (hint) {
	this.hint = $(hint);
}
$class(true, 'Ok'), $class(true, 'Err');
$class(true, 'ErrUnsigned', Err); // ErrUnsigned的父类是Err
</pre>
3个function定义了构造函数，$class把这些function定义为类。

<pre>ok = new Ok("I'm Ok");
_ = $enc(ok, Object);
</pre>
编码后的字符串可以再被解码为数据：
<pre>ok2 = $dec(_);
if (ok.hint != ok2.hint) throw 'error';
</pre>


<!--@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@-->


<h2 id=net>网络</h2>

<h5><i>$http</i> = function (url, time, req, done, data)</h5>
使用XMLHttpRequest进行异步http交互。
req是请求内容字符串，总是用POST方式发出请求，无需格式转换，长度不受限制。
timeout&gt;0是超时毫秒数，否则忽略不做超时处理。
done是交互结束时异步回调的函数，可能是响应，可能是超时，也可能是中止。
返回function()，用来中止这次交互，并异步调用done，如果交互已经结束，则不起作用。

<p>done是function (code, resp, data)。
code是一个整数：0表示交互成功（http响应码200），1表示超时，-1表示停止，100~999表示http响应码，&gt;=1000通常表示网络错误。
当code == 0时resp是服务端返回的响应字符串，其他情况则是错误信息字符串。
data是调用$http的data参数，可以给done传递额外对象，如果调用$http省略data参数，则$http的返回值将做为data传给done。
每次$http交互必调用done正好一次，除非没有设置超时，或者跳转到别的页面，或者Javascript引擎错误;)。

<h5><i>$http.net</i> = 'Network Failure'<br>
<i>$http.off</i> = 'Offline'<br>
<i>$http.time</i> = 'Timeout'<br>
<i>$http.stop</i> = ''</h5>
错误信息字符串，表示网络错误、离线、超时、中止。

<h5><i>$.form</i> = function ()</h5>
创建一个支持文件上传的form dom节点。firstChild为display:none的textarea dom节点。

<h5><i>$http.form</i> = function (url, time, req, done, data, form)</h5>
使用form和iframe进行异步http交互，可上传文件。
各参数参见$http，而form为$.form创建的dom节点。

<h5><i>$http.formNet</i> = 'Network or Server Failure'<br>
<i>$http.n200</i> = '400-500'</h5>
form交互的错误信息，表示网络错误、非200响应码，其他错误信息与$http相同。

<h5><i>$Do</i> = function (url, hint, req, this3, done3, this2, done2, this1, done1, form)</h5>
对$http和$http.form的封装。hint是提示字符串，可供界面显示。
done3~1是回调函数，this3~1是回调时设置的this对象，done1先于done3回调，this3~1为undefined时，done3~1忽略。
$Do返回值和$http相同。

<p>done3~1是 function (ok, err, http)。
若服务器响应200，则$dec解码出数据图的根。
若根不为Err（参见Java端），则ok为根，err为undefined。
若超时或错误或根为Err，ok为undefined，err为Err对象。
若中止，ok和err均为undefined。
http是$Do也是$http的返回值。
当done1出现错误，将传递给Javascript引擎，done2就不执行了，依此类推。

<h5>$Do.err</i> = function (code, res)</h5>
错误时，得到Err对象。默认是return new Err('HTTP Error ' + code + ' ' + res)

<h5><i>$Do.url</i> = ''<br>
<i>$Do.urlPost</i> = ''<br>
<i>$Do.timeout</i> = 30000</h5>
url的前缀和后缀，超时。

<h5><i>$Do.byName</i> = null<br>
<i>$Do.decoded</i> = null</h5>
传递给$dec的两个参数。


<!--@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@-->


<h2 id=dom>DOM操作</h2>

<h5><i>$D</i> = document</h5>

<h5><i>$id</i> = function (id)</h5>
返回$D.getElementById(id)

<h5><i>$dom</i> = function (domOrName, prop, value ...)</h5>
创建或修改一个dom节点。
domOrName为字符串时，通过createElement创建一个节点；为dom节点时，则修改这个节点。
给节点增加了几个方法，参见下文（以$dom.表示）。
<p>
第二个参数开始是若干组属性参数：首先是属性名，然后是属性值。
属性名表示dom节点的javascript属性名（className简写为c，style.cssText简写为s）。
属性值如果是function，则属性名表示事件名（不含on前缀），属性值表示事件响应函数；
随后的参数表示此function的this，再随后的参数表示此function的调用参数（参见$dom.attach，若是最后一组参数，这两个参数可以省略）。
属性值如果是其他值，则直接按照属性名设置到dom节点上。

<h5><i>$doms</i> = function (domOrName, props, from)</h5>
与$dom类似，但属性参数在数组props中，从from下标开始。

<h5><i>$a</i>, <i>$s</i>, <i>$br</i>, <i>$l</i>, <i>$d</i>, <i>$p</i></h5>
与$dom类似，创建&lt;a&gt;, &lt;span&gt;, &lt;br&gt;, &lt;label&gt;, &lt;div&gt;, &lt;p&gt;节点。

<h5><i>$tab</i>, <i>$tb</i>, <i>$tr</i>, <i>$th</i>, <i>$td</i>, <i>$ul</i>, <i>$ol</i>, <i>$li</i></h5>
与$dom类似，创建&lt;table&gt;, &lt;tbody&gt;, &lt;tr&gt;, &lt;th&gt;, &lt;td&gt;, &lt;ul&gt;, &lt;ol&gt;, &lt;li&gt;节点。

<h5><i>$h1</i>, <i>$h2</i>, <i>$h3</i>, <i>$h4</i></h5>
与$dom类似，创建&lt;h1&gt;, &lt;h2&gt;, &lt;h3&gt;, &lt;h4&gt;节点。

<h5><i>$inp</i>, <i>$sel</i>, <i>$ops</i>, <i>$lns</i>, <i>$ln</i>, <i>$chk</i>, <i>$rad</i></h5>
与$dom类似，创建&lt;input&gt;, &lt;select&gt;, &lt;option&gt;, &lt;textarea&gt;, &lt;input type="text"&gt;, &lt;input type="checkbox"&gt;, &lt;input type="radio"&gt;节点。

<h5><i>$a0</i>, <i>$bn</i></h5>
与$dom类似，创建&lt;a&gt;, &lt;button&gt;节点，但绑定了一个click事件响应函数，取消默认行为，即点击不跳转。

<h5><i>$tx</i> = function (singleLine)</h5>
通过createTextNode创建文本节点，不能换行，但允许连续的空格。

<h5>$DE = $dom($D.documentElement)<br>
$B = $dom($D.body)</h5>
简写。

<h5><i>$dom.add</i> = function (index, dom, ...)</h5>
增加子节点，如果index参数被忽略，或<0，或>=现有子节点个数。
在现有index子节点前插入子节点，如果index>0。
返回本节点。

<h5><i>$dom.rem</i> = function (index, len, dom ...)</h5>
删除本节点，如果没有参数。
删除本节点，然后替换成dom，如果index===true且忽略len。
从Math.max(index, 0)开始删除len个子节点，如果index为number且len > 0。
从Math.max(index, 0)开始删除全部子节点，如果index为number且!(len > 0)。
返回本节点。

<h5><i>$dom.des</i> = function (index, len, dom ...)</h5>
与$dom.rem类似，但对删除的节点及其子孙节点，触发名为'des'的事件，解除所有事件响应函数。
返回本节点。对于IE 6，应使用本方法代替$dom.rem，以避免内存泄漏。

<h5><i>$dom.cla</i> = function (remove, clazz)</h5>
设置本节点的css class，如果忽略remove。删除本节点的css class，如果remove===0。返回本节点。

<h5><i>$dom.attr</i> = function (a, v)</h5>
返回名为a的html属性值，如果忽略v。删除html属性值，如果v===null，返回本节点。其他则设置html属性值，返回本节点。

<h5><i>$dom.tx</i> = function (v, multiLine)</h5>
返回本节点及子孙节点的文本内容（或&lt;textarea&gt;的value），如果没有参数。
设置本节点的文本内容（现有子节点被$dom.des），if(multiLine)为多行，否则换行符转换为空格，返回本节点。

<h5><i>$dom.show</i> = function (v)</h5>
返回本节点是否显示（style.display != 'none'），如果没有参数。
切换本节点style.display，如果v===0，返回本节点。
设置本节点style.display为''，if (v)，返回本节点。
设置本节点style.display为'none'，if (!v)，返回本节点。

<h5><i>$dom.attach</i> = function (type, handler, This, args, old)</h5>
绑定事件。type为事件名，不含on前缀。handler为事件响应函数。
This为handler的this，若false，则为本节点，若===true，则new handler。
args为handler的参数，若false，则为事件对象。
old为被替换的handler（先detach old再attach handler），可以忽略。
返回本节点。
一个事件名可以绑定多个handler，调用顺序与绑定相反。

<h5><i>$dom.detach</i> = function (type, handler)</h5>
解除事件绑定。type为事件名，不含on前缀。handler为事件响应函数。


<!--@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@-->


<h2 id=other>其他</h2>

<p>参见源代码。


<!--@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@-->


</body>
</html>
